package juego.Graficos;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;

import juego.Juego;
import juego.Dificultad.Dificultad;
import juego.Persistencia.PersistenciaDeJuego;
import juego.RankingHistorico.PersistenciaRankingHistorico;
import juego.Tablero.InfoTablero;
import juego.Vehiculo.Vehiculo;

public class PantallaDelJuego extends JFrame implements BienvenidaAction, MenuPrincipalAction, JugarAction,ActionGuardarPartida,ActionAceptarUsuario,ActionGuardarUsuario{
	
	private static final long serialVersionUID = 1L;
	
	public static final int SALIR = -1;	
	public static final int BIENVENIDA = 0;
	public static final int ELEGIR_NOMBRE_NUEVO = 1;
	public static final int ELEGIR_NOMBRE_EXISTENTE = 2;
	public static final int MENU_PRINCIPAL = 3;
	public static final int PUNTAJES = 4;
	public static final int NUEVA_PARTIDA = 5;
	public static final int PARTIDA = 6;
	public static final int GANASTE = 7;
	public static final int PERDISTE = 8;
	
	private int estado;
	private String nombreJugador;
	
	private JPanel barraDeTitulo;
	private JPanel panelCentral;
	private JLabel jugador;
	private JLabel titulo;
	private JButton salir;
	private JButton volver;
	private Bienvenida bienvenida;
	private ElegirNombreNuevo elegirNombreNuevo;
	private ElegirNombreExistente elegirNombreExistente;
	private MenuPrincipal menuPrincipal;
	private Puntajes puntajes;
	private NuevaPartida nuevaPartida;
	private Partida partida;
	private Ganaste ganaste;
	private Perdiste perdiste;
	
	public PantallaDelJuego(){
		estado = BIENVENIDA;
		_armarPantalla();
		mostrarPantalla();
	}
	
	private void _armarPantalla() {			
		// ARMADO BARRA DE TITULO
		barraDeTitulo = new JPanel();
		barraDeTitulo.setLayout( new BorderLayout() );
		
		jugador = new JLabel();
		titulo = new JLabel();
		salir = new JButton("Salir");
		volver = new JButton ("volver");
		volver.setFont(new Font("sansserif",Font.ITALIC,14));
		
		
		salir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}	
		});
		
		volver.addActionListener( new ActionListener() {
			public void actionPerformed(ActionEvent e) {	
				estado = MENU_PRINCIPAL;
				mostrarPantalla();
			}	
		});
		
		
		barraDeTitulo.setBackground(Color.BLUE);
		barraDeTitulo.setBorder(new EmptyBorder(10, 10, 10, 10) );

		jugador.setFont( new Font("sansserif",Font.PLAIN,26) );
		jugador.setForeground(Color.WHITE);
		
		titulo.setFont( new Font("sansserif",Font.ITALIC,26) );
		titulo.setForeground(Color.WHITE);
		titulo.setHorizontalAlignment(SwingConstants.CENTER);
		
		salir.setFont(new Font("sansserif",Font.ITALIC,14));
		
		bienvenida = new Bienvenida(this);
		elegirNombreNuevo = new ElegirNombreNuevo(this);
		elegirNombreExistente = new ElegirNombreExistente(this);
		menuPrincipal = new MenuPrincipal(this,this);
		puntajes = new Puntajes();
		nuevaPartida = new NuevaPartida(this);
		partida = new Partida(this);
		ganaste = new Ganaste(this);
		perdiste = new Perdiste(this);
		
		panelCentral = new JPanel();
		panelCentral.setLayout( new BorderLayout());
		setLayout( new BorderLayout());
		add(barraDeTitulo, BorderLayout.NORTH);
		add(panelCentral, BorderLayout.CENTER);
	}
	
	private void _armarTitulo(String sTitulo, boolean bSalir){
		barraDeTitulo.removeAll();
		if (nombreJugador != null) {
			jugador.setText("Hola "+nombreJugador);
			barraDeTitulo.add(jugador, BorderLayout.WEST);
		}
		if (bSalir)
			barraDeTitulo.add(salir, BorderLayout.EAST);
		else
			barraDeTitulo.add(volver, BorderLayout.EAST);
		titulo.setText(sTitulo);
		barraDeTitulo.add(titulo, BorderLayout.CENTER);
	}
	
	public void mostrarPantalla(){
		panelCentral.removeAll();
		switch(estado) {
			case BIENVENIDA:
				_armarTitulo("Bienvenido", true);
				panelCentral.add(bienvenida, BorderLayout.CENTER);
				break;
			
			case ELEGIR_NOMBRE_NUEVO:
				_armarTitulo("",true);
				panelCentral.add(elegirNombreNuevo,BorderLayout.CENTER);
				break;
			
			case ELEGIR_NOMBRE_EXISTENTE:
				_armarTitulo("",true);
				panelCentral.add(elegirNombreExistente,BorderLayout.CENTER);
				break;
				
			case MENU_PRINCIPAL:
				_armarTitulo("GPS CHALLENGE",true);
				panelCentral.add(menuPrincipal,BorderLayout.CENTER);
				break;
				
			case PUNTAJES:
				_armarTitulo("Puntajes",false);
				panelCentral.add(puntajes,BorderLayout.CENTER);
				break;
			
			case NUEVA_PARTIDA:
				_armarTitulo("Nueva Partida",false);
				panelCentral.add(nuevaPartida,BorderLayout.CENTER);
				break;
			
			case PARTIDA:
				_armarTitulo("GPS CHALLENGE",false);
				panelCentral.add(partida,BorderLayout.CENTER);
				break;
				
			case GANASTE:
				_armarTitulo("GPS CHALLENGE",false);
				panelCentral.add(ganaste,BorderLayout.CENTER);
				break;

			case PERDISTE:
				_armarTitulo("GPS CHALLENGE",false);
				panelCentral.add(perdiste,BorderLayout.CENTER);
				break;

		}
		revalidate();
		repaint();
	}
	
	public void accionarBotonSoyNuevo(){
		estado = ELEGIR_NOMBRE_NUEVO;
		mostrarPantalla();	
	}
	public void accionarBotonTengoUsuario(){
		PersistenciaRankingHistorico persistenciaRankingHistorico = new PersistenciaRankingHistorico();
		persistenciaRankingHistorico.abrirArchivo();
		elegirNombreExistente.setearJugadores(persistenciaRankingHistorico.getJugadores());
		
		estado = ELEGIR_NOMBRE_EXISTENTE;
		mostrarPantalla();
	}
	public void accionarBotonVerPuntaje(){
		PersistenciaRankingHistorico persistenciaRankingHistorico = new PersistenciaRankingHistorico();
		persistenciaRankingHistorico.abrirArchivo();
		puntajes.seterPuntajes(persistenciaRankingHistorico.getRankingHiustorico());
		estado = PUNTAJES;
		mostrarPantalla();
	}
	public void accionarBotonReanudarPartida(){
		if (!PersistenciaDeJuego.hayPartidaJugador(nombreJugador)) {
			JOptionPane.showMessageDialog(null, "No hay partida guardada para el jugador");
		}
		else {		
			PersistenciaDeJuego persistencia = new PersistenciaDeJuego();
			persistencia.cargar(nombreJugador);
			Juego juego = new Juego(nombreJugador,persistencia.cargarJugador().getVehiculo(),persistencia.cargarDificultad());
			juego.cargarJuego(persistencia.cargarJugador().getCantidadDeMovimientos(), persistencia.cargarTablero());
			partida.setJuego(juego);
			estado = PARTIDA;
			mostrarPantalla();
		}
	}
	
	public void accionarBotonComenzarPartida(Vehiculo unVehiculo,Dificultad unaDificultad){
		Juego juegoNuevo = new Juego(nombreJugador, unVehiculo, unaDificultad);
		partida.setJuego(juegoNuevo);
		estado = PARTIDA;
		mostrarPantalla();	
	}
	
	public void accionarJugar(){
		estado = NUEVA_PARTIDA;
		mostrarPantalla();
	
	}
	public void accionarAceptarUsuario(String sUsuario){
		nombreJugador = sUsuario;
		estado = MENU_PRINCIPAL;
		mostrarPantalla();
	}
	
	public void accionarGuardarUsuario(String nombre){
		PersistenciaRankingHistorico persistenciaRankingHistorico = new PersistenciaRankingHistorico();
		persistenciaRankingHistorico.abrirArchivo();
		if (persistenciaRankingHistorico.getJugadores().contains(nombre))
			JOptionPane.showMessageDialog(null, "El jugador ya existe");
		else {	
			persistenciaRankingHistorico.guardarJugador(nombre,0, 0);
			
			nombreJugador = nombre;
			estado = MENU_PRINCIPAL;
			mostrarPantalla();
		}
	}
	public String darNombreUsuario(){
		return nombreJugador;
	}

	public void accionarGuardarPartida(Juego juego){
		PersistenciaDeJuego persistencia = new PersistenciaDeJuego();
		persistencia.guardar(juego.getJugador(), juego.getInfoTablero());
		estado = MENU_PRINCIPAL;
		mostrarPantalla();
	}
	
	@Override
	public void accionarGanastePartida(int puntaje, int movimientos, int sobraron) {
		PersistenciaDeJuego.borrarPartidaJugador(nombreJugador);
		PersistenciaRankingHistorico persistenciaRankingHistorico = new PersistenciaRankingHistorico();
		persistenciaRankingHistorico.guardarJugador(nombreJugador, movimientos, puntaje);

		
		estado = GANASTE;
		ganaste.setPuntaje(puntaje, sobraron,nombreJugador);
		mostrarPantalla();
	}

	@Override
	public void accionarPerdistePartida() {
		PersistenciaDeJuego.borrarPartidaJugador(nombreJugador);
		estado = PERDISTE;
		mostrarPantalla();
	}
}
